﻿using System.Data.Entity;
using KPIS.GERP.OMVC.Classes;
using KPIS.GERP.OMVC.SysApprovalService;
using KPIS.GERP.Models;
using System;
using System.Data;
using System.Linq;
using System.Web.Mvc;
using System.Web.UI;
using KPIS.GERP.Models.HRM;
using KPIS.GERP.Models.SYS;

namespace KPIS.GERP.OMVC.Controllers
{
    public class CommandDismissController : Controller
    {
        GERPContext db = new GERPContext(true);
        Common common = new Common();

        //
        // GET: /CommandPenalty/

        public ActionResult Index()
        {
            //IList<PsCommand> model = db.PsCommands.ToList();
            
//SELECT * FROM PsCommand

//SELECT * FROM HrmPsCommandTypes
//SELECT * FROM hrm_ps_command_groups

//6 พ้นราชการ
//7 ย้าย
            return View(db.PsCommands
                .Where(m => m.CmdTypeId != 1700 && (m.HrmPsCommandTypes.CmdGroupId == 6 ) && m.RecordStatus != "D")
                .OrderByDescending(m => m.CreatedWhen)
                .ToList());
        }

        //
        // GET: /CommandPenalty/Details/5

        public ActionResult Details(int id)
        {
            PsCommand item = db.PsCommands.Find(id);
            if (item == null)
            {
                return HttpNotFound();
            }

            //item.ApprovedDate = common.CurrectDateTime(item.ApprovedDate);
            return View(item);
        }

        //
        // GET: /CommandPenalty/Create

        public ActionResult Create()
        {
            return View(new PsCommand());
        }

        //
        // POST: /CommandPenalty/Create

        [HttpPost]
        // [ValidateAntiForgeryToken]
        public ActionResult Create(PsCommand model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    SsMng ssmng = new SsMng();
                    model.CreatedBy = ssmng.EmpSeqI;
                    model.CreatedWhen = DateTime.Now;

                    //using (GERPContext db = new GERPContext(true))
                    //{
                        db.PsCommands.Add(model);
                        db.SaveChanges();
                    //}
                    return RedirectToAction("Edit", new { id = model.CmdId});
                }

                return View(model);
            }
            catch
            {
                return View();
            }
        }

        public ActionResult CreateDetail()
        {
            using (GERPContext db = new GERPContext(true))
            {
                //PsCommand item = db.PsCommands.Find(id);

                return View();
            }
        }

        
         //POST: /CommandPenalty/Create

        [HttpPost]
        // [ValidateAntiForgeryToken]
        public ActionResult CreateDetail(PsCommandDtls model)
        {
            try
            {
                if (ModelState.IsValid)
                //if (model.CmdId != null &&
                //    model.EmpId != null &&
                //    model.StartDate != null)
                {
                    if (model.EndDate != null && model.StartDate > model.EndDate)
                    {
                        ModelState.AddModelError("", "มีผลตั้งแต่วันที่ ต้องไม่มากกว่า มีผลจนถึงวันที่");
                        return Edit(model.CmdId.Value);
                    }

                    using (GERPContext db = new GERPContext(true))
                    {
                        SsMng ssmng = new SsMng();
                        model.CreatedBy = ssmng.EmpSeqI;
                        model.CreatedWhen = DateTime.Now;

                        db.PsCommandDtls.Add(model);
                        db.SaveChanges();
                    }
                    return RedirectToAction("Edit", "CommandDismiss", new { id = model.CmdId });
                }

                return Edit(model.CmdId.Value);
            }
            catch
            {
                return Edit(model.CmdId.Value);
            }
        }
        

        //
        // GET: /CommandPenalty/Edit/5
        public ActionResult Edit(int id = 0)
        {
            //using (GERPContext db = new GERPContext(true))
            //{
                PsCommand item = db.PsCommands.Find(id);
                if (item == null)
                {
                    return HttpNotFound();
                }

                //item.ApprovedDate = common.CurrectDateTime(item.ApprovedDate);
                return View("Edit", item);
            //}
        }

        //
        // POST: /CommandPenalty/Edit/5

        [HttpPost]
        // [ValidateAntiForgeryToken]
        public ActionResult Edit(int id, PsCommand model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    SsMng ssmng = new SsMng();
                    model.UpdatedBy = ssmng.EmpSeqI;
                    model.UpdatedWhen = DateTime.Now;

                    //using (GERPContext db = new GERPContext(true))
                    //{
                        db.Entry(model).State = EntityState.Modified;
                        db.SaveChanges();
                    //}
                    return RedirectToAction("Edit", new { id = model.CmdId });
                }

                return Edit(model.CmdId);
            }
            catch
            {
                return Edit(model.CmdId);
            }
        }

        [HttpPost]
       // [ValidateAntiForgeryToken]
        public ActionResult EditDetail(int id, PsCommandDtls model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    SsMng ssmng = new SsMng();
                    model.UpdatedBy = ssmng.EmpSeqI;
                    model.UpdatedWhen = DateTime.Now;

                    //using (GERPContext db = new GERPContext(true))
                    //{
                    db.Entry(model).State = EntityState.Modified;
                    db.SaveChanges();
                    //}
                    return RedirectToAction("Edit", new { id = model.CmdId });
                }

                return View(model);
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /CommandPenalty/Delete/5

        //public ActionResult Delete(int id)
        //{
        //    return View();
        //}

        //
        // POST: /CommandPenalty/Delete/5

        public ActionResult Delete(int id)
        {
            try
            {
                PsCommand command = db.PsCommands.Find(id);
                command.UpdatedBy = new SsMng().EmpSeqI;
                command.UpdatedWhen = DateTime.Now;
                command.RecordStatus = "D";
                db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return Index();
            }
        }

        public ActionResult DetailDelete(int id, PsCommandDtls model)
        {
            try
            {
                PsCommandDtls command = db.PsCommandDtls.Find(id);
                int intCmdSeq = command.CmdId.Value;

                db.PsCommandDtls.Remove(command);
                db.SaveChanges();

                return RedirectToAction("Edit", new { id = intCmdSeq });
            }
            catch
            {
                return Edit(model.CmdId.Value);
            }
        }

        //
        // GET: /CommandPenalty/Delete/5

        public ActionResult Approve(int id = 0)
        {
            PsCommand item = db.PsCommands.Find(id);
            if (item == null)
            {
                return HttpNotFound();
            }

            //item.ApprovedDate = common.CurrectDateTime(item.ApprovedDate);
            return View(item);
        }

        //
        // POST: /CommandPenalty/Delete/5

        [HttpPost]
        //[ValidateAntiForgeryToken]
        public ActionResult Details(int id, PsCommand model)
        {
            try
            {
                model = db.PsCommands.Find(id);

                //using (var service = new CreateApproveService.ServiceClient())
                //{
                //    string strMessage = "";
                //    int intEmpSeq = new SsMng().EmpSeqI;
                //    service.CreateAbsenceTask("[คำสั่งให้ออก]" + model.CmdName
                //        , intEmpSeq, model.CmdId, "P"
                //        , 901, "A",intEmpSeq, out strMessage);
                //}
                int intEmpSeq = new SsMng().EmpSeqI;
                using(var service = new SysApprovalServiceClient())
                {
                    var result = service.CreateTask(new KPIS.GERP.Models.SYS.ViewModel.CreateTaskVM
                        {
                            Title = "[คำสั่งให้ออก]" + model.CmdName,
                            ApplyToEmpId = intEmpSeq,
                            RefId = model.CmdId,
                            // ApproveProcessEnum is obsolete
                            //public enum ApproveProcessEnum
                            //{
                            //    ลาป่วย = 1,
                            //    ลาคลอดบุตร = 14,
                            //    ลากิจส่วนตัว = 15,
                            //    ลาพักผ่อน = 16,
                            //    ลาอุปสมบทหรือลาไปประกอบพิธีฮัจย์ = 17,
                            //    ลาเข้ารับราชการทหาร = 18,
                            //    ลาไปศึกษา_ฝึกอบรม_ดูงาน_หรือปฏิบัติการ = 19,
                            //    ลาไปปฏิบัติงานในองค์การระหว่างประเทศ = 20,
                            //    ลาติดตามคู่สมรส = 21,
                            //    ลาเข้ารับการตรวจเลือกหรือลาเข้ารับการเตรียมพล = 22,
                            //    ลาไปปฎิบัติหน้าที่ = 23,
                            //    คำสั่งบรรจุ = 101,
                            //    คำสั่ง = 901,
                            //    คำสั่งปรับเพิ่มเงินเดือน = 1000,
                            //    คำสั่งให้ออกจากราชการ = 2000,
                            //    คำสั่งเกษียณอายุราชการ = 3000,
                            //    ขออนุมัติแจ้งความประสงค์ = 6,
                            //    ขออนุมัติขอเบิก = 7,
                            //    ขออนุมัติขอซื้อขอจ้างเกิน๑๐๐๐๐๐บาท = 8,
                            //    ขออนุมัติขอซื้อขอจ้างไม่เกิน๑๐๐๐๐๐บาท = 9,
                            //    ขออนุมัติใบสั่งเกิน๑๐๐๐๐๐บาท = 10,
                            //    ขออนุมัติใบสั่งไม่เกิน๑๐๐๐๐๐บาท = 11,
                            //    ขออนุมัติประกาศ = 12,
                            //    ขออนุมัติงานสัญญา = 13,
                            //    การตรวจรับ = 24
                            //}
                            AppPrcId = 901,//(int)ApproveProcessEnum.คำสั่ง,
                            ConfirmAs = "P",
                            ApproveAs = "A",
                            CreateByEmpId = intEmpSeq
                        });
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View(model);
            }
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public JsonResult GetCmdType(int id)
        {
            using (GERPContext db = new GERPContext(true))
            {
                var item = (from p in db.PsCommandTypes
                            where p.CmdTypeId == id
                            select p).FirstOrDefault();
                return Json(item, JsonRequestBehavior.AllowGet);
            }
        }

        public JsonResult GetDetail(int id)
        {
            using (GERPContext db = new GERPContext(true))
            {
                var item = (from p in db.PsCommandDtls
                            where p.CmdDtlsId == id
                            select p).FirstOrDefault();
                return Json(
                    new
                    {
                        CmdDtlsId = item.CmdDtlsId,
                        CmdId = item.CmdId,
                        EmpId = item.EmpId,
                        StartDate = Common.GetDateString(item.StartDate),
                        EndDate = Common.GetDateString(item.EndDate),
                        Remarks = item.Remarks,
                        RptRemarks = item.RptRemarks
                    }
                    , JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult UpdateCommand(int id)
        {
            try
            {
                PsCommand model = db.PsCommands.Find(id);
                foreach (PsCommandDtls detail in model.col_hrm_ps_command_dtls)
                {
                    switch (model.PenaltyId)
                    {
                        case 1:
                            detail.HrmPsEmployees.EmpStatusId = 302;
                            break;
                        case 2:
                            detail.HrmPsEmployees.EmpStatusId = 905;
                            break;
                    }
                }

                model.RecordStatus = "A";
                model.CmdStatus = "R";

                db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return Details(id);
            }
        }
    }
}
